gdk: Drop configure events
authorMatthias Clasen <mclasen@redhat.com>
Sun, 15 Jul 2018 14:45:57 +0000 (10:45 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 15 Jul 2018 15:51:09 +0000 (11:51 -0400)
Replace configure events with a GdkSurface::size-changed signal.
This is part of the move to use events only for input.

gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkeventsprivate.h
gdk/gdksurface.c
gdk/wayland/gdksurface-wayland.c
gdk/x11/gdkdisplay-x11.c
gtk/gtkimcontextxim.c
gtk/gtkmain.c
gtk/gtkwidget.c
gtk/gtkwindow.c
tests/testwindowsize.c

index e648110212f4b686afd2b6af4b5470d562bca112..d97b05771ba6fd907217a1610e7806cb89c3633d 100644 (file)
@@ -827,7 +827,6 @@ gdk_event_get_time (const GdkEvent *event)
         return event->pad_axis.time;
       case GDK_PAD_GROUP_MODE:
         return event->pad_group_mode.time;
-      case GDK_CONFIGURE:
       case GDK_FOCUS_CHANGE:
       case GDK_NOTHING:
       case GDK_DELETE:
@@ -897,7 +896,6 @@ gdk_event_get_state (const GdkEvent  *event,
       case GDK_LEAVE_NOTIFY:
        *state =  event->crossing.state;
         return TRUE;
-      case GDK_CONFIGURE:
       case GDK_FOCUS_CHANGE:
       case GDK_PROXIMITY_IN:
       case GDK_PROXIMITY_OUT:
@@ -949,10 +947,6 @@ gdk_event_get_coords (const GdkEvent *event,
 
   switch ((guint) event->any.type)
     {
-    case GDK_CONFIGURE:
-      x = event->configure.x;
-      y = event->configure.y;
-      break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
       x = event->crossing.x;
@@ -1083,10 +1077,6 @@ gdk_event_set_coords (GdkEvent *event,
 
   switch ((guint) event->any.type)
     {
-    case GDK_CONFIGURE:
-      event->configure.x = x;
-      event->configure.y = y;
-      break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
       event->crossing.x = x;
index f496502ad247a5256710e6b999c122b9f7ae699a..b1ef21fc5f0a7945bf51867e27b78de1d972e2af 100644 (file)
@@ -112,7 +112,6 @@ typedef struct _GdkEventScroll      GdkEventScroll;
 typedef struct _GdkEventKey        GdkEventKey;
 typedef struct _GdkEventFocus      GdkEventFocus;
 typedef struct _GdkEventCrossing    GdkEventCrossing;
-typedef struct _GdkEventConfigure   GdkEventConfigure;
 typedef struct _GdkEventProximity   GdkEventProximity;
 typedef struct _GdkEventDND         GdkEventDND;
 typedef struct _GdkEventSetting     GdkEventSetting;
@@ -155,8 +154,6 @@ typedef void (*GdkEventFunc) (GdkEvent *event,
  * @GDK_ENTER_NOTIFY: the pointer has entered the surface.
  * @GDK_LEAVE_NOTIFY: the pointer has left the surface.
  * @GDK_FOCUS_CHANGE: the keyboard focus has entered or left the surface.
- * @GDK_CONFIGURE: the size, position or stacking order of the surface has changed.
- *   Note that GTK+ discards these events for %GDK_SURFACE_CHILD surfaces.
  * @GDK_MAP: the surface has been mapped.
  * @GDK_UNMAP: the surface has been unmapped.
  * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing
@@ -215,7 +212,6 @@ typedef enum
   GDK_ENTER_NOTIFY,
   GDK_LEAVE_NOTIFY,
   GDK_FOCUS_CHANGE,
-  GDK_CONFIGURE,
   GDK_MAP,
   GDK_UNMAP,
   GDK_PROXIMITY_IN,
index a7ab6a88ab11f917b118ece706c38c73b7331cdf..ee3beace23edffb9fde6f66a96e95fe6b7269fa6 100644 (file)
@@ -351,26 +351,6 @@ struct _GdkEventFocus
   gint16 in;
 };
 
-/*
- * GdkEventConfigure:
- * @type: the type of the event (%GDK_CONFIGURE).
- * @surface: the surface which received the event.
- * @send_event: %TRUE if the event was sent explicitly.
- * @x: the new x coordinate of the surface, relative to its parent.
- * @y: the new y coordinate of the surface, relative to its parent.
- * @width: the new width of the surface.
- * @height: the new height of the surface.
- *
- * Generated when a surface size or position has changed.
- */
-struct _GdkEventConfigure
-{
-  GdkEventAny any;
-  gint x, y;
-  gint width;
-  gint height;
-};
-
 /*
  * GdkEventProximity:
  * @type: the type of the event (%GDK_PROXIMITY_IN or %GDK_PROXIMITY_OUT).
@@ -601,7 +581,6 @@ struct _GdkEventPadGroupMode {
  * @key: a #GdkEventKey
  * @crossing: a #GdkEventCrossing
  * @focus_change: a #GdkEventFocus
- * @configure: a #GdkEventConfigure
  * @proximity: a #GdkEventProximity
  * @dnd: a #GdkEventDND
  * @grab_broken: a #GdkEventGrabBroken
@@ -653,7 +632,6 @@ union _GdkEvent
   GdkEventKey              key;
   GdkEventCrossing         crossing;
   GdkEventFocus                    focus_change;
-  GdkEventConfigure        configure;
   GdkEventProximity        proximity;
   GdkEventDND               dnd;
   GdkEventGrabBroken        grab_broken;
index bb9785a0a57cf0eb99be5cba95f39e0a9157523e..c96f45e82ff6070de2e53d2ab9053d95516348e7 100644 (file)
@@ -97,6 +97,7 @@
 
 enum {
   MOVED_TO_RECT,
+  SIZE_CHANGED,
   LAST_SIGNAL
 };
 
@@ -310,6 +311,19 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
                   G_TYPE_POINTER,
                   G_TYPE_BOOLEAN,
                   G_TYPE_BOOLEAN);
+
+  signals[SIZE_CHANGED] =
+    g_signal_new (g_intern_static_string ("size-changed"),
+                  G_OBJECT_CLASS_TYPE (object_class),
+                  G_SIGNAL_RUN_FIRST,
+                  0,
+                  NULL,
+                  NULL,
+                  NULL,
+                  G_TYPE_NONE,
+                  2,
+                  G_TYPE_INT,
+                  G_TYPE_INT);
 }
 
 static void
@@ -2663,6 +2677,7 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
 {
   cairo_region_t *old_region, *new_region;
   gboolean expose;
+  gboolean size_changed;
 
   g_return_if_fail (GDK_IS_SURFACE (surface));
 
@@ -2691,6 +2706,7 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
   /* Handle child surfaces */
 
   expose = FALSE;
+  size_changed = FALSE;
   old_region = NULL;
 
   if (gdk_surface_is_viewable (surface) &&
@@ -2716,8 +2732,16 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
     }
   if (!(width < 0 && height < 0))
     {
-      surface->width = width;
-      surface->height = height;
+      if (surface->width != width)
+        {
+          surface->width = width;
+          size_changed = TRUE;
+        }
+      if (surface->height != height)
+        {
+          surface->height = height;
+          size_changed = TRUE;
+        }
     }
 
   recompute_visible_regions (surface, FALSE);
@@ -2740,9 +2764,10 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
       cairo_region_destroy (old_region);
       cairo_region_destroy (new_region);
     }
-}
-
 
+  if (size_changed)
+    g_signal_emit (surface, signals[SIZE_CHANGED], 0, width, height);
+}
 
 /**
  * gdk_surface_move:
@@ -3908,7 +3933,6 @@ _gdk_make_event (GdkSurface    *surface,
       break;
 
     case GDK_FOCUS_CHANGE:
-    case GDK_CONFIGURE:
     case GDK_MAP:
     case GDK_UNMAP:
     case GDK_DELETE:
index 2aedc995d7cc715d520abcdbd92e32ef28adca30..d2a18ea9703e5ed064f954813e0dd4307fd63c45 100644 (file)
@@ -698,20 +698,9 @@ gdk_wayland_surface_configure (GdkSurface *surface,
                                int         height,
                                int         scale)
 {
-  GdkDisplay *display;
-  GdkEvent *event;
-
-  event = gdk_event_new (GDK_CONFIGURE);
-  event->any.surface = g_object_ref (surface);
-  event->any.send_event = FALSE;
-  event->configure.width = width;
-  event->configure.height = height;
-
   gdk_wayland_surface_update_size (surface, width, height, scale);
   _gdk_surface_update_size (surface);
-
-  display = gdk_surface_get_display (surface);
-  _gdk_wayland_display_deliver_event (display, event);
+  g_signal_emit_by_name (surface, "size-changed", width, height);
 }
 
 static gboolean
index d791d420cb7af5818030ae0dabc32fbd081c7689..2f157d3f8a2912d41ebfaed3754141bfd4e0074b 100644 (file)
@@ -960,11 +960,12 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
        return_val = FALSE;
       else
        {
-         event->any.type = GDK_CONFIGURE;
-         event->any.surface = surface;
-         event->configure.width = (xevent->xconfigure.width + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
-         event->configure.height = (xevent->xconfigure.height + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
+          int x, y, width, height;
 
+          x = 0;
+          y = 0;
+         width = (xevent->xconfigure.width + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
+         height = (xevent->xconfigure.height + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
          if (!xevent->xconfigure.send_event &&
              !xevent->xconfigure.override_redirect &&
              !GDK_SURFACE_DESTROYED (surface))
@@ -981,31 +982,34 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
                                         &tx, &ty,
                                         &child_window))
                {
-                 event->configure.x = tx / surface_impl->surface_scale;
-                 event->configure.y = ty / surface_impl->surface_scale;
+                 x = tx / surface_impl->surface_scale;
+                 y = ty / surface_impl->surface_scale;
                }
              gdk_x11_display_error_trap_pop_ignored (display);
            }
          else
            {
-             event->configure.x = xevent->xconfigure.x / surface_impl->surface_scale;
-             event->configure.y = xevent->xconfigure.y / surface_impl->surface_scale;
+             x = xevent->xconfigure.x / surface_impl->surface_scale;
+             y = xevent->xconfigure.y / surface_impl->surface_scale;
            }
+
          if (!is_substructure)
            {
-             surface->x = event->configure.x;
-             surface->y = event->configure.y;
+             surface->x = x;
+             surface->y = y;
 
               if (surface_impl->unscaled_width != xevent->xconfigure.width ||
                   surface_impl->unscaled_height != xevent->xconfigure.height)
                 {
                   surface_impl->unscaled_width = xevent->xconfigure.width;
                   surface_impl->unscaled_height = xevent->xconfigure.height;
-                  surface->width = event->configure.width;
-                  surface->height = event->configure.height;
+                  surface->width = width;
+                  surface->height = height;
 
                   _gdk_surface_update_size (surface);
                   _gdk_x11_surface_update_size (surface_impl);
+
+                  g_signal_emit_by_name (surface, "size-changed", width, height);
                 }
 
              if (surface->resize_count >= 1)
@@ -1014,8 +1018,10 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
 
                  if (surface->resize_count == 0)
                    _gdk_x11_moveresize_configure_done (display, surface);
-               }
+                }
            }
+
+          return_val = FALSE;
         }
       break;
 
index 01629ab05437e5ea208665c94f01d78ffd571b19..7cdb3c75b7067fc598666acf62ca898d2b36a85b 100644 (file)
@@ -1603,6 +1603,7 @@ on_status_toplevel_configure (GtkWidget     *toplevel,
                              GdkEvent      *event,
                              StatusWindow  *status_window)
 {
+#if 0
   if (gdk_event_get_event_type (event) == GDK_CONFIGURE)
     {
       GdkRectangle rect;
@@ -1625,6 +1626,7 @@ on_status_toplevel_configure (GtkWidget     *toplevel,
           gtk_window_move (GTK_WINDOW (status_window->window), rect.x, y);
         }
     }
+#endif
 
   return GDK_EVENT_PROPAGATE;
 }
index 56ab6167d1d882458a4dd517c645f1e19f57c80c..371a67f18f151609e09de0eb029a05fa1278d2fc 100644 (file)
@@ -1846,16 +1846,6 @@ gtk_main_do_event (GdkEvent *event)
         }
       break;
 
-    case GDK_CONFIGURE:
-      if (GTK_IS_WINDOW (event_widget) &&
-          _gtk_widget_get_surface (event_widget) == event->any.surface)
-        {
-          gtk_window_configure (GTK_WINDOW (event_widget),
-                                event->configure.width,
-                                event->configure.height);
-        }
-
-      break;
     case GDK_FOCUS_CHANGE:
     case GDK_UNMAP:
     case GDK_GRAB_BROKEN:
index c929701d94d4af05ea9cafb9ca9dc9ea634755bd..e133f7037dc746566f4ff1bc9d87d404ae8ab98f 100644 (file)
@@ -5288,7 +5288,6 @@ gtk_widget_event_internal (GtkWidget      *widget,
     case GDK_NOTHING:
     case GDK_DELETE:
     case GDK_DESTROY:
-    case GDK_CONFIGURE:
     case GDK_MAP:
     case GDK_UNMAP:
       return gtk_widget_emit_event_signals (widget, event);
index 9f495c12ab901291f1af57c9b003c6c0b48619ea..03210d53deec8789bbed501eca16a8e9ab7a651a 100644 (file)
@@ -6869,6 +6869,7 @@ gtk_window_realize (GtkWidget *widget)
 
   gtk_widget_set_surface (widget, surface);
   g_signal_connect_swapped (surface, "notify::state", G_CALLBACK (surface_state_changed), widget);
+  g_signal_connect_swapped (surface, "size-changed", G_CALLBACK (gtk_window_configure), widget);
   gtk_widget_register_surface (widget, surface);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->realize (widget);
@@ -7007,6 +7008,9 @@ gtk_window_unrealize (GtkWidget *widget)
   g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
                                         G_CALLBACK (surface_state_changed),
                                         widget);
+  g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
+                                        G_CALLBACK (gtk_window_configure),
+                                        widget);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget);
 
index 6e62dd0a600d48ceee02c2c780d45aa7e3228ea6..0f55a45092c4bd0ffee363fd04ee32636a0408b2 100644 (file)
@@ -8,21 +8,14 @@ static GtkWidget *default_width_spin;
 static GtkWidget *default_height_spin;
 static GtkWidget *resizable_check;
 
-static gboolean
-configure_event_cb (GtkWidget *window, GdkEvent *event, GtkLabel *label)
+static void
+configure_event_cb (GtkWidget *window, int width, int height, GtkLabel *label)
 {
-  if (gdk_event_get_event_type (event) == GDK_CONFIGURE)
-    {
-      gchar *str;
-      gint width, height;
-
-      gtk_window_get_size (GTK_WINDOW (window), &width, &height);
-      str = g_strdup_printf ("%d x %d", width, height);
-      gtk_label_set_label (label, str);
-      g_free (str);
-    }
-
-  return GDK_EVENT_PROPAGATE;
+  gchar *str;
+
+  str = g_strdup_printf ("%d x %d", width, height);
+  gtk_label_set_label (label, str);
+  g_free (str);
 }
 
 static void
@@ -71,7 +64,8 @@ show_dialog (void)
   //gtk_widget_show (label);
 
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), label, GTK_RESPONSE_HELP);
-  g_signal_connect (dialog, "event",
+  gtk_widget_realize (dialog);
+  g_signal_connect (gtk_widget_get_surface (dialog), "size-changed",
                     G_CALLBACK (configure_event_cb), label);
 
   gtk_dialog_run (GTK_DIALOG (dialog));